/**
 * DEPENDENCIAS:
 * modulo meusDatatablesUtils.js (funcao de delecao e edicao)
 * modulo meusPopups.js
 * modulo meusGerenciamentoDeErro.js
 * 
 * FUNCIONALIDADE:
 * Funcoes que realizam as chamadas de CRUD 
 * 
 * OBSERVACOES:
 * o wizard valida campo a campo, a validacao realizada pelos metodos do crud 
 * e redundante e serve para detectar se o json deve ser submetido ou nao
 * 
 *  o atributo settings.data setado no momento do before send, evita manipulacoes do objeto json para string 
 *  importante setar no contenttype o charset=utf-8
 *  
 *  TODO
 *  fazer o retorno a listagem apos os metodos de persistencia, ao inves de limpar o formulario.
 *  usar o modulo meusLoadPage.
 */


/*
 funcao de salvar utilizada no modulo meusWizard.js
 valida e bloqueia o formulario
 trata os erros como sessao expirada chamando a funcao 
 trataErro do modulo meusGerenciamentoDeErro.js 
 */
function salvar(formId, url, object){
	$.ajax({
		"type": "POST",
		"contentType": "application/json; charset=utf-8",
		"dataType": "json",
		"url": url,
		"beforeSend": function(xhr,settings){
			var valido = $("#"+formId).validationEngine('validate');
			if(valido==false){
				xhr.abort();
			}else{
				$("#"+formId).block({message: "<img border='0' src='"+"img/ajax-loader.gif"+"'/> &nbsp;Salvando...",
					 css: { 'border': '0px',
							'background': 'transparent',
							'color': 'white'
					      }  
				});
				settings.data = $.toJSON(object);
			}
		},
		"error":trataErro,
		"complete": function(){
				$("#"+formId).unblock();
				$("#"+formId).validationEngine("hide");
		},
		"success": function(){
			showDialog("Sucesso","Registro salvo com sucesso!");
			window.location.hash='';
			window.location.hash.replace('#', '');
			if($("fieldset").length==1){
				$("#"+formId).populate(null,{resetForm:true});
			}else{
				$("#"+formId).formwizard("reset");
			}
		}
	 });
	 
}

function salvarReturn(formId, url, object, functReturn){
	$.ajax({
		"type": "POST",
		"contentType": "application/json; charset=utf-8",
		"dataType": "json",
		"url": url,
		"beforeSend": function(xhr,settings){
			var valido = $("#"+formId).validationEngine('validate');
			if(valido==false){
				xhr.abort();
			}else{
				$("#"+formId).block({message: "<img border='0' src='"+"img/ajax-loader.gif"+"'/> &nbsp;Salvando...",
					 css: { 'border': '0px',
							'background': 'transparent',
							'color': 'white'
					      }  
				});
				settings.data = $.toJSON(object);
			}
		},
		"error":trataErro,
		"complete": function(){
				$("#"+formId).unblock();
				$("#"+formId).validationEngine("hide");
		},
		"success": function(data){
			showDialog("Sucesso","Registro salvo com sucesso!");
			window.location.hash='';
			window.location.hash.replace('#', '');
			if($("fieldset").length==1){
				$("#"+formId).populate(null,{resetForm:true});
			}else{
				$("#"+formId).formwizard("reset");
			}
			functReturn(data);
		}
	 });
	 
}

/*
funcao de atualizar utilizada nos modulo meusWizard.js
valida e bloqueia o formulario 
trata os erros como sessao expirada chamando a funcao 
trataErro do modulo meusGerenciamentoDeErro.js
*/
function atualizar(formId, url, object){
	$.ajax({
		"type": "PUT",
		"contentType": "application/json; charset=utf-8",
		"dataType": "json",
		"url": url,
		"beforeSend": function(xhr,settings){
			var valido = $("#"+formId).validationEngine('validate');
			if(valido==false){
				xhr.abort();
			}else{
				$("#"+formId).block({message: "<img border='0' src='"+"img/ajax-loader.gif"+"'/> &nbsp;Atualizando...",
					 css: { 'border': '0px',
							'background': 'transparent',
							'color': 'white'
					      } 
				});
				settings.data = $.toJSON(object);
			}
		},
		"error":trataErro,
		"complete": function(){
				$("#"+formId).unblock();
				$("#"+formId).validationEngine("hide");
		},
		"success": function(){
			showDialog("Sucesso","Registro atualizado com sucesso!");
			window.location.hash='';
			window.location.hash.replace('#', '');
			if($("fieldset").length==1){
				$("#"+formId).populate(null,{resetForm:true});
			}else{
				$("#"+formId).formwizard("reset");
			}
		}
	 });
	 
}

function atualizarReturn(formId, url, object, functReturn){
	$.ajax({
		"type": "PUT",
		"contentType": "application/json; charset=utf-8",
		"dataType": "json",
		"url": url,
		"beforeSend": function(xhr,settings){
			var valido = $("#"+formId).validationEngine('validate');
			if(valido==false){
				xhr.abort();
			}else{
				$("#"+formId).block({message: "<img border='0' src='"+"img/ajax-loader.gif"+"'/> &nbsp;Atualizando...",
					 css: { 'border': '0px',
							'background': 'transparent',
							'color': 'white'
					      } 
				});
				settings.data = $.toJSON(object);
			}
		},
		"error":trataErro,
		"complete": function(){
				$("#"+formId).unblock();
				$("#"+formId).validationEngine("hide");
		},
		"success": function(){
			showDialog("Sucesso","Registro atualizado com sucesso!");
			window.location.hash='';
			window.location.hash.replace('#', '');
			if($("fieldset").length==1){
				$("#"+formId).populate(null,{resetForm:true});
			}else{
				$("#"+formId).formwizard("reset");
			}
			functReturn();
		}
	 });
	 
}

/*
funcao de deletar utilizada no modulo meusDatatables.js
trata os erros como sessao expirada chamando a funcao 
trataErro do modulo meusGerenciamentoDeErro.js
*/
function deletarDoBanco(url, event,idDataGrid){
	if(confirm("Deseja realmente remover ?")){
		var registro = selecionarObjeto(event, idDataGrid);
		$.ajax({
			"type": "DELETE",
			"contentType": "application/json",
			"dataType": "json",
			"url": url.replace(url.substring(url.indexOf("bServerSideHql"), url.length), '')+registro.id,
			"beforeSend": function(xhr,settings){
					$("#"+idDataGrid+"_wrapper").block({message: "<img border='0' src='"+"img/ajax-loader.gif"+"'/> &nbsp;Deletando ...",
						 css: { 'border': '0px',
								'background': 'transparent',
								'color': 'white'
						      } 
					});
			},
			"error":trataErro,
			"complete": function(){
				$("#"+idDataGrid+"_wrapper").unblock();
			},
			"success": function(){
				showDialog("Sucesso","Deletado");
				$("#"+idDataGrid).dataTable().fnCallBServerSearch();
			}
		});
	}
}

function deletarDoBancoReturn(url, event, idDataGrid, functReturn){
	if(confirm("Deseja realmente remover ?")){
		var registro = selecionarObjeto(event, idDataGrid);
		$.ajax({
			"type": "DELETE",
			"contentType": "application/json",
			"dataType": "json",
			"url": url.replace(url.substring(url.indexOf("bServerSideHql"), url.length), '')+registro.id,
			"beforeSend": function(xhr,settings){
					$("#"+idDataGrid+"_wrapper").block({message: "<img border='0' src='"+"img/ajax-loader.gif"+"'/> &nbsp;Deletando ...",
						 css: { 'border': '0px',
								'background': 'transparent',
								'color': 'white'
						      } 
					});
			},
			"error":trataErro,
			"complete": function(){
				$("#"+idDataGrid+"_wrapper").unblock();
			},
			"success": function(){
				showDialog("Sucesso","Deletado");
				$("#"+idDataGrid).dataTable().fnCallBServerSearch();
				functReturn();
			}
		});
	}
}

function deletarReturn(url, id, functReturn){
	if(confirm("Deseja realmente remover ?")){
		$.ajax({
			"type": "DELETE",
			"contentType": "application/json",
			"dataType": "json",
			"url": url+"/"+id,
//			"beforeSend": function(xhr,settings){
//					$("#"+idDataGrid+"_wrapper").block({message: "<img border='0' src='"+"img/ajax-loader.gif"+"'/> &nbsp;Deletando ...",
//						 css: { 'border': '0px',
//								'background': 'transparent',
//								'color': 'white'
//						      } 
//					});
//			},
			"error":trataErro,
			"complete": function(){
//				$("#"+idDataGrid+"_wrapper").unblock();
			},
			"success": function(){
				showDialog("Sucesso","Deletado");
//				$("#"+idDataGrid).dataTable().fnCallBServerSearch();
				functReturn();
			}
		});
	}
}

/*
funcao de editar utilizada no modulo meusDatatables.js
monta a url de edicao baseada na url de listagem e carrega a pagina de edicao
*/
function editar(event,idDataGrid,url,classe){
	var objSelecionado= selecionarObjeto(event, idDataGrid);
	var id = objSelecionado.id;
	var urlDeAtualizacao = url.replace(url.substring(url.indexOf("bServerSideHql"), url.length), '') + id+"?formJq&class="+classe;
	//urlDeAtualizacao = url.replace("/bServerSideHql","")+"/"+ id+"?formJq&class="+classe;
	loadPage(urlDeAtualizacao);
}


/*
funcao de vizualizar utilizada no modulo meusDatatables.js
mostra mensagem, usa o modulo meusPopups.js
*/
function vizualizar(){
	showDialog("Vizualizar dados!","Para vizualizar os demais dados selecione a seta no canto superior direito e em seguida o campo desejado.");
}

/*
funcao de delecao, tanto da tela quanto do banco, caso url seja null deleta 
apenas da tela.
*/
function multiDelete(id,url){
	
	//pega os dados dos selecionados
	var selecionados = fnGetSelected(id);
	var idsToDelete=[];
	for ( var i = 0; i < selecionados.length; i++) {
		idsToDelete.push(selecionados[i].id);
	}
	
	//pega as linhas selecionadas
	var trsSelecionados = fnGetSelectedsTr(id);
	
	//se houver algo selecionado
	if(selecionados.length>0){

		//confirma se deseja realmente deletar
		if(confirm("Deseja realmente remover ?")){
			
			//caso seja para deletar do banco de dados no servidor 
			//deverá haver o atributo url preenchido
			if(url!=null){
				
					jQuery.ajax({
							"type": "DELETE",
					    	"url": url,
					    	"contentType": "application/json; charset=utf-8",
					  		"dataType": "json",
					  		"data": JSON.stringify(idsToDelete),
					  		"beforeSend": function(xhr){
					  			
					  			//mascara a linha
				 				for(var i=0; i<trsSelecionados.length; i++){
				 					var tdsDoTr = $(trsSelecionados[i]).children();
				 					for(var j=0; j<tdsDoTr.length; j++){
										$(tdsDoTr[j]).contents().wrapAll("<div id='row_mask_cell_bug_fighter_"+i+"_"+j+"' />");
										var arrWrapper = $("#row_mask_cell_bug_fighter_"+i+"_"+j);
										for(var k=0; k<arrWrapper.length; k++){
												$(arrWrapper[k]).parent().css("padding", 0);
												$(arrWrapper[k]).height($(arrWrapper[k]).parent().height());
										}
				 					}
				 					$('div[id^="row_mask_cell_bug_fighter_"]').block({message: "<img border='0' src='"+"img/ajax-loader.gif"+"'/>",
				 						css: { 'border': '0px',
				 								'background': 'transparent',
				 								'color': 'white'
				 							} 
				 					});
				 				}//fim for
				 				
					  		},
					  		"complete": function(){
					  			$('div[id^="row_mask_cell_bug_fighter_"]').unblock();	
							},
							"success": listar,
						  	"error": trataErro
						});
			}else {
				//caso nao haja o atributo url, somente deleta da tela as linhas selecionadas
				for(var i=0 ;i<trsSelecionados.length ;i++ ){
							$('#'+id).dataTable().fnDeleteRow($('#'+id).dataTable().fnGetPosition(trsSelecionados[i]));
				}
			}//fim do atributo url
			
		}//fim do confirm
	}//fim do if selecionados
}
